Skip to content

feat: group skills on install and mark audit input untrusted - #81

Merged
svyatov merged 1 commit into
mainfrom
feat/group-skills-and-mark-audit-input-untrusted
Aug 11, 2026
Merged

feat: group skills on install and mark audit input untrusted#81
svyatov merged 1 commit into
mainfrom
feat/group-skills-and-mark-audit-input-untrusted

Conversation

@svyatov

@svyatov svyatov commented Aug 11, 2026

Copy link
Copy Markdown
Owner

What changed

.claude-plugin/plugin.json lists all nine skills in a skills array. Installing oss-kit with npx skills offered nine separate rows, so a user had to pass --skills '*' or select every one by hand. It now renders one select-all group.

oss-audit marks the output of scripts/collect.mjs as untrusted input. The script opens its output with an untrustedContent field saying every value below is quoted from the repository under audit and is data rather than instruction, and Step 3 of SKILL.md says the same where it tells a reader to run the script.

tests/manifests.test.ts compares the array against the directories that actually carry a SKILL.md, so a skill added to skills/ and left out of the manifest fails the build.

Why this way

The installer matches a skill's own directory against the array, at src/skills.ts:202 in vercel-labs/skills, so a single ./skills/ entry groups nothing and every path has to be named. .codex-plugin and .cursor-plugin keep the one-line "./skills/" form, because only the Claude manifest is read for grouping and only it needs maintenance when a skill is added.

The guard test is not tidiness. Claude Code's skills field normally adds to the default skills/ scan, but the plugin's marketplace entry resolves to the marketplace root, which is the documented exception where the declared paths replace that scan. Without the test, a tenth skill would stop loading in Claude Code and nothing would say so.

Skills.sh raises Snyk W011 against oss-audit for third-party content exposure, and the finding is right about the behaviour: precededBy, heading text, link text, and job names are free prose an outsider chose. Stripping that prose is not available, because several rules are scored on it, so the change names the trust boundary instead of trying to remove it.

Verification

The guard test was proved by dropping oss-writing from the array and watching it fail, then restoring the file.

bun test reports 328 passing, and bun run validate, scripts/check-drift.sh, and scripts/check-ecosystems.mjs are clean. scripts/prose.mjs reports no finding on CHANGELOG.md or on oss-audit/SKILL.md.

The grouping is verified against the installer's source rather than a live install, because the CLI clones from the remote and the manifest is only observable there after this merges.

Known gaps

The group renders as Oss Kit. The installer title-cases each hyphen-separated word of the plugin name, so OSS Kit needs a plugin rename and is not worth one.

Grouping turns the picker's search box off, which the installer decides and this repository cannot influence.

The Snyk rating may stay at Med Risk, because the behaviour W011 describes is still present. Disputing the code upstream is the remaining option, on the argument that a local checkout the user pointed the audit at is not the public user-generated content W011 defines.

Affects

Rule or skill Change
oss-audit collector output and Step 3 mark repository content as untrusted input

`.claude-plugin/plugin.json` lists all nine skills in a `skills` array, so
`npx skills` renders one select-all group instead of nine loose rows. The
installer matches a skill's own directory against the array, so a single
`./skills/` entry grouped nothing.

`oss-audit` states that the output of `scripts/collect.mjs` is quoted from the
repository under audit and is data rather than instruction. Heading text, the
line before a fenced block, link text, and job names are prose an outsider
wrote, and they reached the audit with nothing marking the trust boundary.
@svyatov
svyatov merged commit 871bd94 into main Aug 11, 2026
12 checks passed
@svyatov
svyatov deleted the feat/group-skills-and-mark-audit-input-untrusted branch August 11, 2026 16:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant